﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Modelo;
using System.Data.SqlClient;
using System.Data;
using System.Collections;
using System.Collections.ObjectModel;

namespace BaseDatos
{
    public static class BDProducto
    {
        private static string conexionCentral = "Data Source=.\\sqlexpress; Initial Catalog=FarmaciaAurora; Integrated Security=true";
        private static string conexionSucursal1 = "Data Source=10.0.0.5 Initial Catalog=FarmaciaAuroraSucursal; Integrated Security=SSPI; Trusted_Connection=false; User ID=Gerard; Password = Gerard123";
        private static string conexionSucursal2 = "Data Source=.\\sqlexpress; Initial Catalog=FarmaciaAuroraSucursal2; Integrated Security=true";

        public static void ActualizarProducto(Producto producto)
        {
            try
            {
                ActualizarProducto(producto, conexionCentral);
            }
            catch (Exception)
            {
                throw new Exception("El producto " + producto.nombreComercial + " no se pudo actualizar en la central");
            }
            try
            {
                ActualizarProducto(producto, conexionSucursal1);
            }
            catch (Exception)
            {
                throw new Exception("El producto " + producto.nombreComercial + " no se pudo actualizar en la sucursal 1");
            }
            try
            {
                ActualizarProducto(producto, conexionSucursal2);
            }
            catch (Exception)
            {
                throw new Exception("El producto " + producto.nombreComercial + " no se pudo actualizar en la sucursal 2");
            }
            
        }
        private static void ActualizarProducto(Producto producto, string conexion)
        {
            SqlConnection sql = null;
            try
            {
                sql = new SqlConnection(conexion);
                SqlCommand comando = sql.CreateCommand();
                comando.CommandText = "UPDATE  Producto set NombreQuimico=@nombreQuimico, IdProveedor=@idProveedor, NombreComercial=@nombreComercial, PrecioUnitarioCompra=@precioUnitarioCompra, PrecioUnitarioVenta=@precioUnitarioVenta, Detalle=@detalle where IdProducto=@idProducto";
                comando.Parameters.AddWithValue("nombreQuimico",producto.nombreQuimico);
                comando.Parameters.AddWithValue("idProveedor",producto.proveedor.idProveedor);
                comando.Parameters.AddWithValue("nombreComercial",producto.nombreComercial);
                comando.Parameters.AddWithValue("precioUnitarioCompra",producto.precioUnitarioCompra);
                comando.Parameters.AddWithValue("precioUnitarioVenta",producto.precioUnitarioVenta);
                comando.Parameters.AddWithValue("detalle",producto.Detalle);
                comando.Parameters.AddWithValue("idProducto",producto.idProducto);
                sql.Open();
                comando.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw new Exception("Hubo un error en el servidor");
            }
            finally
            {
                if (sql != null)
                    sql.Dispose();
            }
        }
        public static List<Producto> obtenerTodosLosProductos()
        {
            SqlConnection sql = null;
            List<Producto> productos = null;
            try
            {
                sql = new SqlConnection(conexionCentral);
                productos = new List<Producto>();
                SqlCommand comando = sql.CreateCommand();
                comando.CommandText = "SELECT * from Producto";
                sql.Open();
                SqlDataReader reader = comando.ExecuteReader();
                while (reader.Read())
                {
                    Producto producto = new Producto();
                    producto.idProducto = long.Parse(reader["IdProducto"].ToString());
                    producto.nombreComercial = reader["NombreComercial"].ToString();
                    producto.nombreQuimico = reader["NombreQuimico"].ToString();
                    producto.precioUnitarioCompra = float.Parse(reader["PrecioUnitarioCompra"].ToString());
                    producto.precioUnitarioVenta = float.Parse(reader["PrecioUnitarioVenta"].ToString());
                    producto.proveedor = BDProveedor.buscarProveedor(float.Parse(reader["IdProveedor"].ToString()));
                    productos.Add(producto);
                }
            }
            catch (Exception)
            {
            }
            finally
            {
                if (sql != null)
                    sql.Dispose();
            }
            return productos;
        }
        public static List<Producto> buscarProductoPor(string nombreComercial)
        {
            SqlConnection sql = null;
            List<Producto> productos = null;

            try
            {
                sql = new SqlConnection(conexionCentral);
                SqlCommand comando = sql.CreateCommand();
                comando.CommandText = "SELECT * FROM Producto WHERE NombreComercial LIKE '%'+ @nombreComercial + '%'";
                comando.Parameters.AddWithValue("nombreComercial",nombreComercial);
                sql.Open();
                SqlDataReader reader = comando.ExecuteReader();
                if(reader.HasRows)
                    productos = new List<Producto>();
                while(reader.Read())
                {
                    Producto producto = new Producto();
                    producto.nombreComercial = reader["NombreComercial"].ToString();
                    producto.nombreQuimico = reader["NombreQuimico"].ToString();
                    producto.precioUnitarioCompra = float.Parse(reader["PrecioUnitarioCompra"].ToString());
                    producto.precioUnitarioVenta = float.Parse(reader["PrecioUnitarioVenta"].ToString());
                    producto.idProducto = long.Parse(reader["IdProducto"].ToString());
                    producto.proveedor = BDProveedor.buscarProveedor(float.Parse(reader["IdProveedor"].ToString()));
                    productos.Add(producto);
                }
            }
            catch (Exception ex)
            {

                throw ex;
            }
            finally
            {
                if (sql != null)
                    sql.Dispose();
            }
            return productos;
        }
        public static Venta buscarProducto(string codigo, int cantidad)
        {

            SqlConnection sql = null;
            
            try
            {
                sql = new SqlConnection(conexionCentral);
                SqlDataAdapter comando = new SqlDataAdapter();
                comando.SelectCommand = new SqlCommand("Select P.IdProducto,Sum(L.Cantidad) as TotalProducto,NombreComercial,PrecioUnitarioVenta from [Producto] as P,[Almacen] as A,[Lote] as L where P.IdProducto=@proc And P.IdProducto=A.IdProducto and A.IdLote=L.IdLote And Caducado='False' And Agotado='False' Group By P.IdProducto,NombreComercial,PrecioUnitarioVenta", sql);
             
                comando.SelectCommand.Parameters.AddWithValue("proc", codigo);
                sql.Open();
                DataTable dt = new DataTable();
                comando.Fill(dt);
                Venta venta = null;
                foreach (DataRow row in dt.Rows)
                {
                    if (Convert.ToInt32(row["TotalProducto"])<cantidad)
                        throw new Exception("solo contamos con "+Convert.ToInt32(row["TotalProducto"]) +" unidades de este producto");
                        
                            venta = new Venta();
                            venta.IdProducto = row["IdProducto"].ToString();
                            venta.NombreProducto = row["NombreComercial"].ToString();
                            venta.Cantidad = cantidad.ToString();
                            venta.Valor = row["PrecioUnitarioVenta"].ToString();
                            venta.Total = (Convert.ToDouble(venta.Cantidad) * Convert.ToDouble(venta.Valor)).ToString();
                        
                    }
                

                if (venta==null)
                    throw new Exception("No contamos con este producto");
                    
                    return venta;
                
                
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (sql != null)
                    sql.Dispose();
            }
           
        }
        public static Producto RegistrarNuevo(Producto producto)
        {
            Producto prod1=null;
            Producto prod2=null;
            Producto prod3=null;
            try
            {
                 prod1= RegistrarNuevo(producto, conexionCentral);
            }
            catch(Exception)
            {
                throw new Exception("El producto "+producto.nombreComercial+" no se pudo insertal en la central");
            }
            try
            {
                 prod2= RegistrarNuevo(producto, conexionSucursal1);
            }
            catch(Exception)
            {
                throw new Exception("El producto " + producto.nombreComercial + " no se pudo insertal en la sucursal 1");
            }
            try
            {
                 prod3= RegistrarNuevo(producto,conexionSucursal2);
            }
            catch(Exception)
            {
                throw new Exception("El producto " + producto.nombreComercial + " no se pudo insertal en la sucursal 2");
            }
            if (prod1 == null)
                throw new Exception("Error al insertar producto en la central");
            if (prod2 == null)
                throw new Exception("Error al insertar producto en la sucursal 1");
            if (prod3 == null)
                throw new Exception("Error al insertar producto en la sucursal 2");
            return prod3;
        }
        private static Producto RegistrarNuevo(Producto producto,string conexion)
        {
            SqlConnection sql = null;
            try
            {
                sql = new SqlConnection(conexion);
                SqlCommand comando = sql.CreateCommand();
                comando.CommandText = "INSERT INTO Producto (NombreQuimico, IdProveedor, NombreComercial,PrecioUnitarioVenta,PrecioUnitarioCompra,Detalle) values(@nombreQuimico,@idProveedor,@nombreComercial,@precioUnitarioVenta,@precioUnitarioCompra,@detalle) SELECT SCOPE_IDENTITY() as Num";
                
                comando.Parameters.AddWithValue("nombreQuimico", producto.nombreQuimico);
                comando.Parameters.AddWithValue("nombreComercial", producto.nombreComercial);
                comando.Parameters.AddWithValue("idProveedor", producto.proveedor.idProveedor);
                comando.Parameters.AddWithValue("precioUnitarioVenta", producto.precioUnitarioVenta);
                comando.Parameters.AddWithValue("precioUnitarioCompra", producto.precioUnitarioCompra);
                comando.Parameters.AddWithValue("Detalle",producto.Detalle);
                sql.Open();
                SqlDataReader reader = comando.ExecuteReader();
                if (reader.Read())
                {
                    producto.idProducto = long.Parse(reader["num"].ToString());
                    return producto;
                }
            }
            catch (Exception e)
            {
                throw e;
            }
            finally
            {
                if (sql != null)
                    sql.Dispose();
            }
            return null;
           
        }
    }
}
